﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using Sistema_Totem.Logica.Clases;
using System.Data;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Datos.SqlServer
{
    public class SqlServerRol
    {
        #region Agregar Rol
        /// <summary>
        /// Método que accede a la base de datos
        /// para crear un rol.
        /// </summary>
        /// <param name="rol"></param>
        /// <returns></returns>
        public bool AgregarRol(Rol rol)
        {
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSRol]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@NombreRol",
                rol.Nombre);
                command.Parameters.AddWithValue("@TipoRol",
                rol.TipoRol);
                command.Parameters.AddWithValue("@Descripcion",
                rol.Descripcion);

                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                return true;
            }
            catch (SqlException e)
            {
                //En caso de que se viole la restriccion UNIQUE 
                //sobre el nombre del rol.
                if (e.Message.Contains("UNIQUE KEY"))
                    throw (new RolExcepcion("El Rol ya se encuentra registrado ", e));
                else
                throw new RolExcepcion("Error: " + e.Message);
            }
            catch (Exception e)
            {
                throw new RolExcepcion("Error: " + e.Message);
            }
            finally
            {
                bd.CerrarConexionBd();
            }
        }
        #endregion Agregar Rol

        #region Modificar Rol
        /// <summary>
        /// Método que accede a la base de datos
        /// para modificar un rol.
        /// </summary>
        /// <param name="rol"></param>
        /// <returns></returns>
        public bool ModificarRol(Rol rol)
        {
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[UPDRol]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Identificador",
                    rol.Id);
                command.Parameters.AddWithValue("@NombreRol",
                    rol.Nombre);
                command.Parameters.AddWithValue("@TipoRol",
                   rol.TipoRol);
                command.Parameters.AddWithValue("@Descripcion",
                   rol.Descripcion);

                SqlDataReader reader = command.ExecuteReader();

                if (reader.RecordsAffected.Equals(0))
                {
                    return false;
                }
                reader.Close();
                return true;
            }
            catch (SqlException e)
            {
                throw new RolExcepcion("Error: " + e.Message);
            }
            catch (Exception e)
            {
                throw new RolExcepcion("Error: " + e.Message);
            }
            finally
            {
                bd.CerrarConexionBd();
            }
        }
        #endregion Modificar Rol

        #region Consultar Rol
        /// <summary>
        /// Método que accede a la base de datos
        /// para consultar un rol específico por nombre.
        /// </summary>
        /// <param name="rol"></param>
        /// <returns></returns>
        public Rol ConsultarRol(string nombre)
        {
            Rol rol = null;
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[CONRol]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@NombreRol1", nombre);

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    rol = new Rol(reader[0].ToString(), reader[1].ToString());
                }
                reader.Close();
                bd.CerrarConexionBd();
                return rol;
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return rol;
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                return rol;
            }
        }
        #endregion Consultar Rol

        #region Lista de Roles
        /// <summary>
        /// Método que accede a la base de datos
        /// y devuelve una lista de roles.
        /// </summary>
        /// <returns></returns>
        public List<Rol> ListaDeRoles()
        {
            List<Rol> listaRol = new List<Rol>();

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();

            miConexion.AbrirConexionBd();
            command.Connection = miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "[dbo].[SELRol]"; //Nombre del StoreProcedure "SELRoles"
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Rol roles = new Rol();
                roles.Id = Convert.ToInt32(reader["Id_Rol"]);
                roles.Nombre = reader["NombreRol"].ToString();
                roles.TipoRol = reader["TipoRol"].ToString();
                roles.Descripcion = reader["DescripcionRol"].ToString();

                listaRol.Add(roles);
            }
            reader.Close();
            miConexion.CerrarConexionBd();
            if (listaRol.ElementAt(0).Nombre == null)
            {
                return null;
            }
            else
                return listaRol;
        }
        #endregion Lista de Roles

        #region Consultar Rol Modificar
        /// <summary>
        /// Método que accede a la base de datos
        /// para consultar un rol específico por
        /// identificador.
        /// </summary>
        /// <param name="rol"></param>
        /// <returns></returns>
        public Rol ConsultarRolModificar(int valor)
        {
            Rol rol = null;
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[CONRolM]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Identificador", valor);

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    rol = new Rol(reader[0].ToString(), reader[1].ToString(), reader[2].ToString());
                }
                reader.Close();
                bd.CerrarConexionBd();
                return rol;
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return rol;
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                return rol;
            }
        }
        #endregion Consultar Rol Modificar
    }
}